
package sgsi.controller.dao.impl;

import java.util.List;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import sgsi.controller.dao.ArticuloDao;
import sgsi.model.entidades.Articulo;

public class ArticuloDaoHibernateImpl extends HibernateDaoSupport implements ArticuloDao {

	private static final String BUSCAR_POR_CODIGO = "select a from Articulo a where a.estaBorrado is false and a.codigoArticulo = ?";
	private static final String BUSCAR_TODOS      = "select a from Articulo a where a.estaBorrado is false and ";
	private static final String NOMBRE = "a.nombre like ";
	private static final String TIPO   = "a.tipoDeArticulo = ";
	private static final String CODIGO_DE_BARRAS = " a.codigoDeBarras = ";
	private static final String BUSCAR_POR_TIPO_DE_ARTICULO      = "select a from Articulo a where a.estaBorrado is false and a.tipoDeArticulo.codigoTipoDeArticulo = ?";
	private static final String CODIGO = "a.codigoArticulo = ";
	
	
	@SuppressWarnings("unchecked")
	public List<Articulo> obtenerPorTipoDeArticulo(int codigoTipoDeArticulo) {
		return getHibernateTemplate().find(BUSCAR_POR_TIPO_DE_ARTICULO, codigoTipoDeArticulo);
	}

	@SuppressWarnings("unchecked")
	public Articulo obtenerPorAmbosCodigos(String codigo) {
		String newQuery = BUSCAR_TODOS + "(" + CODIGO + codigo + " OR " + CODIGO_DE_BARRAS + "'" + codigo + "')" ;				
		List<Articulo> resultado = getHibernateTemplate().find( newQuery );
		
		if (resultado.isEmpty() || resultado.size() > 1)
			return null;
	
		return (Articulo) resultado.get(0);
	}

	@SuppressWarnings("unchecked")
	public Articulo obtenerPorCodigo(int codigo) {
		List<Articulo> resultado = getHibernateTemplate().find(BUSCAR_POR_CODIGO, codigo);
		
		if (resultado.isEmpty())
			return null;
	
		return (Articulo) resultado.get(0);
	}

	public Articulo guardar(Articulo articulo) {
		getHibernateTemplate().saveOrUpdate(articulo);
		return null;
	}

	@SuppressWarnings("unchecked")
	public List<Articulo> obtenerTodosBusqueda(String nombre, int tipo) {
		String newQuery = BUSCAR_TODOS + NOMBRE + "'%" + nombre + "%'";
		if(tipo!=0){
			newQuery = newQuery + " AND " + TIPO + tipo;
		}
		return getHibernateTemplate().find( newQuery );
	}
	
	@SuppressWarnings("unchecked")
	public List<Articulo> obtenerTodosBusqueda(String nombre, int tipo, int codigoDeBarras) {
		String newQuery = BUSCAR_TODOS + NOMBRE + "'%" + nombre + "%'";
		if(tipo!=0){
			newQuery = newQuery + " AND " + TIPO + tipo;
		}
		if(codigoDeBarras>0){
			newQuery = newQuery + " AND " + CODIGO_DE_BARRAS + codigoDeBarras;
		}
		return getHibernateTemplate().find( newQuery );
	}

	public void eliminar(int codigo) {
		getHibernateTemplate().delete(obtenerPorCodigo(codigo));
	}

}
